creates a new race from scratch and verifies the overview
A race director fills in all the details needed to create a brand-new race — the race name, date, start time, how many checkpoints there are, and the range of runner bib numbers. Once saved, the race overview page should correctly display the race name, list every checkpoint, and show the right number of registered runners.
22.4spassed
01-A Home — Welcome Back screen with 3 module cards001 page load → /01-B Home — Welcome Back screen with 3 module cards002 route → /02-A Race Maintenance → Create New Race — setup wizard opens02-B Race Maintenance → Create New Race — setup wizard opens03-A Step 1 of 4 — Template: choose Start from Scratch003 route → /race-management004 route → /race-maintenance/setup03-B Step 1 of 4 — Template: choose Start from Scratch04-A Step 2 of 4 — Race Details: enter name, date, start time and checkpoints04-B Step 2 of 4 — Race Details: enter name, date, start time and checkpoints05-A Step 3 of 4 — Runner Setup: add bib number range 101–11505-B Step 3 of 4 — Runner Setup: add bib number range 101–11506-A Step 4 of 4 — Waves: confirm wave and save race06-B Step 4 of 4 — Waves: confirm wave and save race07-A Race overview — name, 3 checkpoints and 15 runners correct005 route → /race-maintenance/overview?raceId=107-B Race overview — name, 3 checkpoints and 15 runners correct08-A Home — new race listed under module cards006 page load → /08-B Home — new race listed under module cardsfinal state
✅
step indicator advances correctly through setup wizard
The race creation wizard has four steps: Template, Race Details, Runner Setup, and Waves. This test checks that the progress indicator at the top updates as you advance through each step, so the race director always knows where they are in the setup process.
17.8spassed
01-A Step 1 of 4 — Template: setup wizard opens001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-B Step 1 of 4 — Template: setup wizard opens02-A Step 2 of 4 — Race Details: step indicator shows step 202-B Step 2 of 4 — Race Details: step indicator shows step 203-A Step 3 of 4 — Runner Setup: step indicator advances to step 303-B Step 3 of 4 — Runner Setup: step indicator advances to step 3final state
✅
back button on step 2 returns to race details with data preserved
If a race director fills in the race name and other details on Step 2 of 4 (Race Details), moves on to Step 3 of 4 (Runner Setup), then clicks Back, all their work should still be there — the race name and other fields must not be wiped out. Nobody should have to retype information just because they went back a step.
18.5spassed
01-A Step 1 of 4 — Template: choose Start from Scratch001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-B Step 1 of 4 — Template: choose Start from Scratch02-A Step 2 of 4 — Race Details: fill in race name and details02-B Step 2 of 4 — Race Details: fill in race name and details03-A Step 3 of 4 — Runner Setup: navigate forward then press Back03-B Step 3 of 4 — Runner Setup: navigate forward then press Back04-A Step 2 of 4 — Race Details: data preserved after Back04-B Step 2 of 4 — Race Details: data preserved after Backfinal state
Checkpoint Operations
6 passed
✅
navigates to checkpoint and sees runner grid
A checkpoint volunteer opens the app, taps "Checkpoint Operations", selects their race, and arrives at the correct checkpoint screen. This test confirms that the grid of runner bib numbers — the list of every runner they need to watch for — is visible and fully loaded.
7.2spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Home — tap Checkpoint Operations module card003 route → /race-maintenance/overview?raceId=1004 page load → /01-B Home — tap Checkpoint Operations module card005 route → /02-A Select Race modal — choose race from list02-B Select Race modal — choose race from list006 route → /checkpoint/103-A Checkpoint view — runner grid loaded with bib numbers 200–21003-B Checkpoint view — runner grid loaded with bib numbers 200–210final state
✅
marks off a single runner via the runner grid
A checkpoint volunteer clicks on a single runner's bib number tile in the grid to record that the runner passed through. The tile should change colour or appearance to make it obvious that runner has been marked as "through".
21.9spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup003 route → /race-maintenance/overview?raceId=101-B Checkpoint view — runner grid visible004 page load → /checkpoint/1005 route → /checkpoint/102-A Runner grid — tap first runner tile (200s range)02-B Runner grid — tap first runner tile (200s range)03-A Runner tile — marked state applied03-B Runner tile — marked state appliedfinal state
✅
marks off multiple runners via Quick Entry
Instead of finding runners in the grid, a volunteer can just type a bib number and press Enter to record it quickly. This test enters two bib numbers one after the other using the quick-entry shortcut and confirms both runners are marked off.
9.3spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Checkpoint view — Quick Entry bar visible003 route → /race-maintenance/overview?raceId=101-B Checkpoint view — Quick Entry bar visible004 page load → /checkpoint/1005 route → /checkpoint/102-A Quick Entry — type first bib number and press Enter02-B Quick Entry — type first bib number and press Enter03-A Quick Entry — type second bib number and press Enter03-B Quick Entry — type second bib number and press Enter04-A Runner grid — both runners marked off04-B Runner grid — both runners marked offfinal state
✅
switches to Callout Sheet tab
The Callout Sheet tab shows the list of runners who have not yet been recorded at this checkpoint. Volunteers read these numbers out over the radio to base station. This test checks the tab loads correctly and the list is visible.
6.8spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Checkpoint view — Mark Off tab active003 route → /race-maintenance/overview?raceId=101-B Checkpoint view — Mark Off tab active004 route → /checkpoint/102-A Callout Sheet tab — tap to switch02-B Callout Sheet tab — tap to switch03-A Callout Sheet — unrecorded runners listed03-B Callout Sheet — unrecorded runners listedfinal state
✅
switches to Overview tab and shows runner counts
The Overview tab shows a summary — how many runners have been through, how many are still expected, and other totals. This test confirms those summary numbers appear correctly when the tab is selected.
6.8spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Checkpoint view — navigate to checkpoint003 route → /race-maintenance/overview?raceId=101-B Checkpoint view — navigate to checkpoint02-A Overview tab — tap to switch004 route → /checkpoint/102-B Overview tab — tap to switch03-A Overview — runner count summary visible03-B Overview — runner count summary visiblefinal state
✅
can export checkpoint results
At the end of a checkpoint shift, a volunteer may need to export their recorded data to share with base station or keep as a backup. This test checks that the export option can be opened from the checkpoint screen.
navigates to base station and sees data entry form
A base station operator opens the app, taps "Base Station Operations", selects their race, and lands on the data entry screen. This test confirms the form for entering finish times and runner bib numbers is ready to use.
5.6sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
⏭️
enters a common time and runner batch, then verifies in overview
The most common base station task: the operator types in a finish time (for example 10:45:00) then lists all the runner bib numbers who crossed the finish line at that time. After submitting, those runners should appear in the overview with their recorded finish time.
5.7sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
⏭️
records a DNF via the withdrawal dialog
When a runner drops out of the race and does not finish (DNF), the base station operator needs to record this. This test opens the withdrawal dialog, enters a runner's bib number and a reason such as "Injured ankle", confirms the entry, and checks that the runner now shows a DNF status in the overview.
5.6sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
⏭️
opens the Checkpoint Matrix tab
The Checkpoint Matrix gives a bird's-eye view of where all runners are across every checkpoint in the race. This test checks that switching to the Checkpoint Matrix tab loads and displays checkpoint information correctly.
5.6sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
⏭️
switches to Reports tab and renders a report
The Reports tab lets the operator generate a printed summary of race results. This test switches to the tab and checks that the report content — runner totals, times, and status counts — is visible.
5.6sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
⏭️
exports base station data
The base station operator may need to export all their recorded data for backup or to share with the race director. This test checks that the import/export tool can be opened from the base station screen.
5.7sskipped
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
Race Management
7 passed
✅
race management page lists created races
The Race Management page is the race director's central hub where all races are listed. This test confirms that a race created earlier in the test suite appears on that page.
20.5spassed
01-A Race Management — page lists all created races001 page load → /race-maintenance/setup002 route → /race-maintenance/setup003 page load → /race-management01-B Race Management — page lists all created races004 route → /race-maintenance/overview?raceId=1final state
✅
clicking a race opens its overview
When the race director clicks on a race in the management list, they should be taken to that race's overview page where they can see all the details. This test confirms that navigation works correctly.
20.9spassed
01-A Race Management — page with race listed001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-B Race Management — page with race listed003 page load → /race-management02-A Race card — click race name to open overview004 route → /race-maintenance/overview?raceId=1005 route → /race-management02-B Race card — click race name to open overview03-A Race overview — name and details visible03-B Race overview — name and details visiblefinal state
✅
creates a second race from the management page
A race director creates a second race directly from the management screen, going through the full two-step setup wizard (race details, then runner ranges) and landing on the new race's overview page.
21.0spassed
01-A Race Management — tap Create New Race button001 page load → /race-management01-B Race Management — tap Create New Race button002 route → /race-management02-A Step 1 of 4 — Template: choose Start from Scratch003 route → /race-maintenance/setup02-B Step 1 of 4 — Template: choose Start from Scratch03-A Step 2 of 4 — Race Details: enter name, date, start time03-B Step 2 of 4 — Race Details: enter name, date, start time04-A Step 3 of 4 — Runner Setup: add bib range 500–50304-B Step 3 of 4 — Runner Setup: add bib range 500–50305-A Step 4 of 4 — Waves: confirm and save05-B Step 4 of 4 — Waves: confirm and save004 route → /race-maintenance/overview?raceId=106-A Race overview — second race created successfully06-B Race overview — second race created successfullyfinal state
✅
race overview shows correct runner and checkpoint counts
After creating a race with runner bib numbers 400 to 405 (6 runners) and 2 checkpoints, the race overview page should display "6" as the runner count and "2" as the checkpoint count — no more, no less.
From the race overview, a race director can jump straight to any checkpoint's live mark-off screen. This test clicks the Checkpoint 1 link and confirms the checkpoint mark-off screen opens.
5.0spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
✅
navigates from race overview to base station
From the race overview, a race director can jump straight to the base station. This test clicks the Base Station button on the overview page and confirms the base station operations screen opens.
4.9spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setupfinal state
✅
home page landing shows the race management module card
The Race Maintenance module card should always be visible on the home screen so race directors can always find it easily. This test simply confirms the card is present.
15.7spassed
01-A Home — Race Maintenance module card visible001 page load → /01-B Home — Race Maintenance module card visible002 route → /final state
Navigation Protection
4 passed
✅
shows protection modal when leaving active checkpoint operation
While a checkpoint volunteer is actively recording runners, the app should warn them if they try to navigate away — for example by tapping the back button or going to a different module. This prevents accidentally losing all their recorded data. This test triggers that navigation and confirms the warning appears.
6.2spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Checkpoint view — navigate directly to /checkpoint/1003 route → /race-maintenance/overview?raceId=102-A Attempt navigation away — go to home /02-B Attempt navigation away — go to home /004 page load → /03-A Protection modal — operation warning or graceful fallback005 route → /03-B Protection modal — operation warning or graceful fallbackfinal state
✅
allows navigation after confirming exit from active operation
If a volunteer sees the "you're about to leave an active session" warning and confirms they want to leave anyway, the app should let them go and return them to the home screen. This test confirms that confirming the exit actually works.
6.3spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Checkpoint view — navigate to /checkpoint/1003 route → /race-maintenance/overview?raceId=102-A Confirm exit — trigger exit and accept confirmation02-B Confirm exit — trigger exit and accept confirmation004 page load → /03-A Navigation complete — landed on non-checkpoint route005 route → /03-B Navigation complete — landed on non-checkpoint routefinal state
✅
home page module cards are all accessible when no operation is active
When the app is idle on the home screen and no operation is in progress, all three module cards — Checkpoint Operations, Base Station, and Race Maintenance — should be enabled and ready to tap. This test confirms none of them are accidentally disabled.
5.5spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Home page — all module cards visible and enabled003 route → /race-maintenance/overview?raceId=1004 page load → /01-B Home page — all module cards visible and enabled005 route → /final state
✅
unknown routes redirect to home
If someone types a web address that doesn't exist in the app (perhaps a typo or an old bookmark), they should be automatically sent to the home page rather than seeing a blank or broken screen.
5.7spassed
001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-A Unknown route — redirects to home page003 route → /race-maintenance/overview?raceId=1004 page load → /this/route/does/not/exist01-B Unknown route — redirects to home page005 route → /this/route/does/not/exist006 route → /final state
Settings
3 passed
✅
opens and closes the Settings modal
Tapping the settings cog in the top-right corner should open the settings panel. Pressing the Escape key (or tapping close) should dismiss it cleanly. This test confirms both actions work.
16.3spassed
01-A Home — tap Settings cog button (aria-label Settings)001 page load → /01-B Home — tap Settings cog button (aria-label Settings)002 route → /02-A Settings modal — panel open with customisation options02-B Settings modal — panel open with customisation options03-A Settings modal — closed after pressing X button03-B Settings modal — closed after pressing X buttonfinal state
✅
toggles dark mode on and off
The dark mode toggle in settings switches the app between a light colour scheme and a dark one. This test turns dark mode on, confirms the dark theme is applied, then turns it back off and confirms the light theme is restored.
16.5spassed
01-A Home — open Settings modal001 page load → /01-B Home — open Settings modal002 route → /02-A Settings modal — locate Dark Mode toggle switch02-B Settings modal — locate Dark Mode toggle switch03-A Dark mode ON — html element gains "dark" class03-B Dark mode ON — html element gains "dark" class04-A Dark mode OFF — "dark" class removed from html element04-B Dark mode OFF — "dark" class removed from html elementfinal state
✅
settings persist after closing and reopening the modal
Changes made in settings should be saved and remembered. If dark mode is turned on and the settings panel is closed then reopened, dark mode should still be on — the preference should not reset.
16.9spassed
01-A Home — open Settings modal001 page load → /01-B Home — open Settings modal002 route → /02-A Settings modal — enable dark mode and save02-B Settings modal — enable dark mode and save03-A Home — reopen Settings modal03-B Home — reopen Settings modal04-A Settings modal — dark mode toggle persists as checked04-B Settings modal — dark mode toggle persists as checkedfinal state
Import Export
0 passed3 failed
⏭️
export modal opens from base station header
The base station screen has an import/export button in the header. This test confirms that tapping it opens the data portability dialog where the operator can choose what to export.
0.1sskipped
final state
⏭️
downloads a race configuration JSON file
This test triggers the export function and confirms that a JSON file is actually downloaded to the device. The file should contain the race configuration — name, checkpoints, runner numbers — that can be used to restore the race on another device.
20.0sskipped
01-A Race Management — page with created race listed001 page load → /race-maintenance/setup002 route → /race-maintenance/setup01-B Race Management — page with created race listed003 page load → /race-management02-A Race card — open export / download option004 route → /race-maintenance/overview?raceId=1005 route → /race-managementfinal state
⏭️
imports a race configuration and restores data
After wiping all data from the app, this test uploads a previously exported race file and confirms the race is fully restored — the race name, checkpoints, and runner numbers all come back exactly as they were before the data was cleared.